﻿using SIIE_ERP.Codigo;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SIIE_ERP.BaseDatos.Inventarios.Transacciones
{
    public class Trans_MovInv
    {
        #region Propiedades

        private string _RFC;
        private string _Usuario;

        #endregion
        
        #region Constructores

        public Trans_MovInv(string RFC, string Usuario)
        {
            this._RFC = RFC;
            this._Usuario = Usuario;
        }

        #endregion
        
        #region INSERT

        public Respuesta Insert_Trans_MovInv_Cab(
                      	
	        EstatusDocs_Id Estatus,
	        DateTime Fecha_Mov,
	        string Descripcion,
	        int Id_TipoMov_Inv,
	        string Referencia,
	        int Id_Almacen,
	        int? Id_Documento_Origen,
	        int? Tipo_Documento_Origen,
            int Partidas        
        )
        {            
            try
            {
                string Query = @"

                INSERT INTO dbo_Trans_MovInv_Cab
                (
                    Id_MovInventario,
	                RFC,
	                Secuencia,
	                Estatus,
	                Fecha_Mov,
	                Descripcion,
	                Id_TipoMov_Inv,
	                Referencia,
	                Id_Almacen,
	                Id_Documento_Origen,
	                Tipo_Documento_Origen,
	                Partidas,
	                UserHostAddress,
	                Fecha_Alta,
	                Usuario_Alta,
	                Fecha_Mantto,
	                Usuario_Mantto
                )
                VALUES
                (
                    IIF(DCount('*', 'dbo_Trans_MovInv_Cab') = 0, 1, DMax('Id_MovInventario', 'dbo_Trans_MovInv_Cab') + 1),
                    '@@RFC',
                    IIF(DCount('*', 'dbo_Trans_MovInv_Cab', ""RFC = '@@RFC'"") = 0, 1, DMax('Id_MovInventario', 'dbo_Trans_MovInv_Cab', ""RFC = '@@RFC'"") + 1),
                    @@Estatus,
	                '@@Fecha_Mov',
	                '@@Descripcion',
	                @@Id_TipoMov_Inv,
	                '@@Referencia',
	                @@Id_Almacen,
	                @@Id_Documento_Origen,
	                @@Tipo_Documento_Origen,
	                @@Partidas,
	                '',
                    NOW(),
                    '@@Usuario_Alta',   
                    NOW(),
                    '@@Usuario_Mantto'
                )";

                Query = Query.Replace("@@RFC", this._RFC);

                Query = Query.Replace("@@Estatus", Estatus.GetHashCode().ToString());
                Query = Query.Replace("@@Fecha_Mov", Fecha_Mov.ToString());
                Query = Query.Replace("@@Descripcion", Descripcion.Replace("'", "''"));
                Query = Query.Replace("@@Id_TipoMov_Inv", Id_TipoMov_Inv.ToString());
                Query = Query.Replace("@@Referencia", Referencia.Replace("'", "''"));
                Query = Query.Replace("@@Id_Almacen", Id_Almacen.ToString());

                if (Tipo_Documento_Origen.HasValue)
                    Query = Query.Replace("@@Tipo_Documento_Origen", Tipo_Documento_Origen.ToString());
                else
                    Query = Query.Replace("@@Tipo_Documento_Origen", "NULL");

                if (Id_Documento_Origen.HasValue)
                    Query = Query.Replace("@@Id_Documento_Origen", Id_Documento_Origen.ToString());
                else
                    Query = Query.Replace("@@Id_Documento_Origen", "NULL");
                
                Query = Query.Replace("@@Partidas", Partidas.ToString());

                Query = Query.Replace("@@Usuario_Alta", this._Usuario);
                Query = Query.Replace("@@Usuario_Mantto", this._Usuario);

                return SrvDB.ExecuteQuery_Insert(Query);
            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }
            
        }
    

        public Respuesta Insert_Trans_MovInv_Linea(
            int Id_Inv_Fisico,
            int Id_Articulo,
            double Cantidad,
            string Comentarios
        )
        {
            try
            {
                string Query2 = @"

                UPDATE dbo_Trans_MovInv_Cab 
                     SET 
                        Partidas = DMax('Partidas', 'dbo_Trans_MovInv_Cab', ""Id_MovInventario = @@Id"") + 1
                     WHERE Id_MovInventario = @@Id
                ";

                Query2 = Query2.Replace("@@Id", Id_Inv_Fisico.ToString());

                SrvDB.ExecuteQuery_Insert(Query2);
                
                string Query = @"

                INSERT INTO dbo_Trans_MovInv_Linea
                (   
	                	Id_Linea_MovInventario,
	                    RFC,
	                    Id_MovInventario,
	                    Secuencia,
	                    Id_Articulo,
	                    Cantidad,
	                    Comentarios,
	                    Fecha_Alta,
	                    Usuario_Alta,
	                    Fecha_Mantto,
	                    Usuario_Mantto
                )
                VALUES
                (
                    IIF(DCount('*', 'dbo_Trans_MovInv_Linea') = 0, 1, DMax('Id_Linea_MovInventario', 'dbo_Trans_MovInv_Linea') + 1),
                    '@@RFC',
                    @@Id_Padre,
                    IIF(DCount('*', 'dbo_Trans_MovInv_Linea', ""Id_Linea_MovInventario = @@Id_Padre"") = 0, 1, DMax('Id_Linea_MovInventario', 'dbo_Trans_MovInv_Linea', ""Id_Linea_MovInventario = @@Id_Padre"") + 1)                ,
                    @@Id_Articulo,
	                @@Cantidad,
                    '@@Comentarios',
                    NOW(),
                    '@@Usuario_Alta',
                    NOW(),
                    '@@Usuario_Mantto'
                )";
                
                Query = Query.Replace("@@RFC", this._RFC);
                Query = Query.Replace("@@Id_Padre", Id_Inv_Fisico.ToString());
                Query = Query.Replace("@@Id_Articulo", Id_Articulo.ToString());
                Query = Query.Replace("@@Cantidad", Cantidad.ToString());
                Query = Query.Replace("@@Comentarios", Comentarios.Replace("'", "''"));
                Query = Query.Replace("@@Usuario_Alta", this._Usuario);
                Query = Query.Replace("@@Usuario_Mantto", this._Usuario);

                return SrvDB.ExecuteQuery_Insert(Query);
            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }
        }


        #endregion

        #region UPDATE

        public Respuesta Update_Estatus_Trans_MovInv_Cab(
            int Id_MovInventario,
            EstatusDocs_Id Estatus)
        {

            try
            {
                string Query = @"UPDATE dbo_Trans_MovInv_Cab SET
                                      
	                                Estatus = @@Estatus,	                                                
	                                Fecha_Mantto = NOW(),
	                                Usuario_Mantto = '@@Usuario_Mantto'

                                 WHERE 
                                    Id_MovInventario = @@Id_MovInventario";

                Query = Query.Replace("@@Id_MovInventario", Id_MovInventario.ToString());
                Query = Query.Replace("@@Estatus", Estatus.GetHashCode().ToString());
                Query = Query.Replace("@@Usuario_Mantto", this._Usuario);
                return SrvDB.ExecuteQuery_Update(Query);
            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }
        }


        public Respuesta Update_Trans_MovInv_Cab(

            int Id_MovInventario,
            EstatusDocs_Id Estatus,
            DateTime Fecha_Mov,
            string Descripcion,
            int Id_TipoMov_Inv,
            string Referencia,
            int Id_Almacen,
            int Partidas             
        )
        {
            try
            {
                string Query = @"UPDATE dbo_Trans_MovInv_Cab SET
                                      
	                                Estatus = @@Estatus,
	                                Fecha_Mov = @@Fecha_Mov,
	                                Descripcion = @@Descripcion,
	                                Id_TipoMov_Inv = @@Id_TipoMov_Inv,
	                                Referencia = @@Referencia,
	                                Id_Almacen = @@Id_Almacen,
	                                Partidas = @@Partidas,	                                
	                                Fecha_Mantto = NOW(),
	                                Usuario_Mantto = '@Usuario_Mantto'

                                 WHERE 
                                    Id_MovInventario = @@Id_MovInventario";

                Query = Query.Replace("@@Id_MovInventario", Id_MovInventario.ToString());
                Query = Query.Replace("@@Estatus", Estatus.GetHashCode().ToString());
                Query = Query.Replace("@@Fecha_Mov", Fecha_Mov.ToString());
                Query = Query.Replace("@@Descripcion", Descripcion.Replace("'", "''"));
                Query = Query.Replace("@@Id_TipoMov_Inv", Id_TipoMov_Inv.ToString());
                Query = Query.Replace("@@Referencia", Referencia.Replace("'", "''"));
                Query = Query.Replace("@@Id_Almacen", Id_Almacen.ToString());

                Query = Query.Replace("@@Partidas", Partidas.ToString());
                Query = Query.Replace("@@Usuario_Mantto", this._Usuario);           

                return SrvDB.ExecuteQuery_Update(Query);
            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }
        }

        #endregion

        #region SELECT

        public DataTable Get_Report(int Id_MovInventario)
        {
            string Query = @"

                SELECT 
       
	                dbo_Trans_MovInv_Cab.RFC, 
	                dbo_Trans_MovInv_Cab.Id_MovInventario, 
	                dbo_Trans_MovInv_Cab.Secuencia, 
	                dbo_Trans_MovInv_Cab.Estatus, 
	                dbo_Cat_Estatus.Nombre AS Estatus_Desc, 
	                dbo_Trans_MovInv_Cab.Fecha_Mov, 
	                dbo_Trans_MovInv_Cab.Descripcion, 
	                dbo_Trans_MovInv_Cab.Id_TipoMov_Inv, 
	                dbo_Cat_TipoMov_Inv.Nombre AS Tipo_Movimiento, 
	                dbo_Cat_TipoMov_Inv.Naturaleza, 
	                dbo_Trans_MovInv_Cab.Referencia, 
	                dbo_Trans_MovInv_Cab.Id_Almacen, 
	                dbo_Cat_Almacen.Descripcion AS Almacen, 
	                dbo_Trans_MovInv_Linea.Id_Linea_MovInventario, 
	                dbo_Trans_MovInv_Linea.Secuencia AS Secuencia_Linea, 
	                dbo_Trans_MovInv_Linea.Id_Articulo, 
	                dbo_Cat_Articulo.Clave AS Clave_Articulo, 
	                dbo_Cat_Articulo.Nombre AS Articulo, 
	                dbo_Cat_Articulo.NombreTicket, 
	                dbo_Trans_MovInv_Linea.Cantidad, 
	                dbo_Trans_MovInv_Linea.Cantidad * dbo_Cat_Articulo.Costo_Std AS Costo_Std, 
	                dbo_Trans_MovInv_Linea.Cantidad * dbo_Cat_Articulo.Costo_Ultimo AS Costo_Ultimo, 
	                dbo_Trans_MovInv_Linea.Cantidad * dbo_Cat_Articulo.Costo_Promedio AS Costo_Promedio, 
              
	                Switch(
		                dbo_Cat_Articulo.Costo_Pref = '1', 	dbo_Trans_MovInv_Linea.Cantidad * dbo_Cat_Articulo.Costo_Std ,
		                dbo_Cat_Articulo.Costo_Pref = '2', 	dbo_Trans_MovInv_Linea.Cantidad * dbo_Cat_Articulo.Costo_Promedio ,
		                dbo_Cat_Articulo.Costo_Pref = '3', 	dbo_Trans_MovInv_Linea.Cantidad * dbo_Cat_Articulo.Costo_Ultimo
                    ) AS Costo_Preferido, 			  
			  	
	                dbo_Trans_MovInv_Linea.Comentarios, 
	                dbo_Cat_Moneda.Clave AS Clave_Moneda, 
	                dbo_Cat_Moneda.Simbolo AS Simbolo_Moneda, 
	                dbo_Cat_Moneda.Nombre AS Moneda, 
	                dbo_Cat_Grupo_Productos.Nombre AS Grupo_Producto, 
	                dbo_Cat_Subgrupo_Productos.Nombre AS Subgrupo_Producto, 
	                dbo_Cat_Linea.Nombre AS Linea, 
	                dbo_Cat_Talla.Nombre AS Talla, 
	                dbo_Cat_Color.Nombre AS Color, 
	                dbo_Cat_TipoCambio.TipoCambio

                FROM            
	
	                ((((((((((((dbo_Trans_MovInv_Cab 
	                INNER JOIN dbo_Trans_MovInv_Linea ON dbo_Trans_MovInv_Cab.Id_MovInventario = dbo_Trans_MovInv_Linea.Id_MovInventario )
	                INNER JOIN dbo_Cat_Almacen ON dbo_Trans_MovInv_Cab.Id_Almacen = dbo_Cat_Almacen.Id_Almacen )
	                INNER JOIN dbo_Cat_Articulo ON dbo_Trans_MovInv_Linea.Id_Articulo = dbo_Cat_Articulo.Id_Articulo )
	                INNER JOIN dbo_Cat_Moneda ON dbo_Cat_Articulo.Id_Moneda = dbo_Cat_Moneda.Id_Moneda )
	                INNER JOIN dbo_Cat_Estatus ON dbo_Trans_MovInv_Cab.Estatus = dbo_Cat_Estatus.Estatus )
	                INNER JOIN dbo_Cat_TipoMov_Inv ON dbo_Trans_MovInv_Cab.Id_TipoMov_Inv = dbo_Cat_TipoMov_Inv.Id_TipoMov_Inv )
	                INNER JOIN dbo_Cat_Grupo_Productos ON dbo_Cat_Articulo.Id_GrupoProductos = dbo_Cat_Grupo_Productos.Id_GrupoProductos )
	                INNER JOIN dbo_Cat_Subgrupo_Productos ON dbo_Cat_Articulo.Id_SubgrupoProductos = dbo_Cat_Subgrupo_Productos.Id_SubgrupoProductos )
	                INNER JOIN dbo_Cat_Linea ON dbo_Cat_Articulo.Id_Linea = dbo_Cat_Linea.Id_Linea )
	                INNER JOIN dbo_Cat_Talla ON dbo_Cat_Articulo.Id_Talla = dbo_Cat_Talla.Id_Talla )
	                INNER JOIN dbo_Cat_Color ON dbo_Cat_Articulo.Id_Color = dbo_Cat_Color.Id_Color )
	                INNER JOIN dbo_Cat_TipoCambio ON dbo_Cat_Moneda.Id_Moneda = dbo_Cat_TipoCambio.Id_Moneda )
                            
                WHERE 

                    dbo_Trans_MovInv_Cab.Id_MovInventario = @@Id 

            ";
            Query = Query.Replace("@@Id", Id_MovInventario.ToString());

            return SrvDB.ExecuteQuery_Get(Query);
        }

        public DataTable Get_Report(int Id_Almacen, int Id_TipoMov, int Estatus, int Tiempo)
        {
            string Query = @"

                SELECT 
       
	                dbo_Trans_MovInv_Cab.RFC, 
	                dbo_Trans_MovInv_Cab.Id_MovInventario, 
	                dbo_Trans_MovInv_Cab.Secuencia, 
	                dbo_Trans_MovInv_Cab.Estatus, 
	                dbo_Cat_Estatus.Nombre AS Estatus_Desc, 
	                dbo_Trans_MovInv_Cab.Fecha_Mov, 
	                dbo_Trans_MovInv_Cab.Descripcion, 
	                dbo_Trans_MovInv_Cab.Id_TipoMov_Inv, 
	                dbo_Cat_TipoMov_Inv.Nombre AS Tipo_Movimiento, 
	                dbo_Cat_TipoMov_Inv.Naturaleza, 
	                dbo_Trans_MovInv_Cab.Referencia, 
	                dbo_Trans_MovInv_Cab.Id_Almacen, 
	                dbo_Cat_Almacen.Descripcion AS Almacen, 
	                dbo_Trans_MovInv_Linea.Id_Linea_MovInventario, 
	                dbo_Trans_MovInv_Linea.Secuencia AS Secuencia_Linea, 
	                dbo_Trans_MovInv_Linea.Id_Articulo, 
	                dbo_Cat_Articulo.Clave AS Clave_Articulo, 
	                dbo_Cat_Articulo.Nombre AS Articulo, 
	                dbo_Cat_Articulo.NombreTicket, 
	                dbo_Trans_MovInv_Linea.Cantidad, 
	                dbo_Trans_MovInv_Linea.Cantidad * dbo_Cat_Articulo.Costo_Std AS Costo_Std, 
	                dbo_Trans_MovInv_Linea.Cantidad * dbo_Cat_Articulo.Costo_Ultimo AS Costo_Ultimo, 
	                dbo_Trans_MovInv_Linea.Cantidad * dbo_Cat_Articulo.Costo_Promedio AS Costo_Promedio, 
              
	                Switch(
		                dbo_Cat_Articulo.Costo_Pref = '1', 	dbo_Trans_MovInv_Linea.Cantidad * dbo_Cat_Articulo.Costo_Std ,
		                dbo_Cat_Articulo.Costo_Pref = '2', 	dbo_Trans_MovInv_Linea.Cantidad * dbo_Cat_Articulo.Costo_Promedio ,
		                dbo_Cat_Articulo.Costo_Pref = '3', 	dbo_Trans_MovInv_Linea.Cantidad * dbo_Cat_Articulo.Costo_Ultimo
                    ) AS Costo_Preferido, 			  
			  	
	                dbo_Trans_MovInv_Linea.Comentarios, 
	                dbo_Cat_Moneda.Clave AS Clave_Moneda, 
	                dbo_Cat_Moneda.Simbolo AS Simbolo_Moneda, 
	                dbo_Cat_Moneda.Nombre AS Moneda, 
	                dbo_Cat_Grupo_Productos.Nombre AS Grupo_Producto, 
	                dbo_Cat_Subgrupo_Productos.Nombre AS Subgrupo_Producto, 
	                dbo_Cat_Linea.Nombre AS Linea, 
	                dbo_Cat_Talla.Nombre AS Talla, 
	                dbo_Cat_Color.Nombre AS Color, 
	                dbo_Cat_TipoCambio.TipoCambio

                FROM            
	
	                ((((((((((((dbo_Trans_MovInv_Cab 
	                INNER JOIN dbo_Trans_MovInv_Linea ON dbo_Trans_MovInv_Cab.Id_MovInventario = dbo_Trans_MovInv_Linea.Id_MovInventario )
	                INNER JOIN dbo_Cat_Almacen ON dbo_Trans_MovInv_Cab.Id_Almacen = dbo_Cat_Almacen.Id_Almacen )
	                INNER JOIN dbo_Cat_Articulo ON dbo_Trans_MovInv_Linea.Id_Articulo = dbo_Cat_Articulo.Id_Articulo )
	                INNER JOIN dbo_Cat_Moneda ON dbo_Cat_Articulo.Id_Moneda = dbo_Cat_Moneda.Id_Moneda )
	                INNER JOIN dbo_Cat_Estatus ON dbo_Trans_MovInv_Cab.Estatus = dbo_Cat_Estatus.Estatus )
	                INNER JOIN dbo_Cat_TipoMov_Inv ON dbo_Trans_MovInv_Cab.Id_TipoMov_Inv = dbo_Cat_TipoMov_Inv.Id_TipoMov_Inv )
	                INNER JOIN dbo_Cat_Grupo_Productos ON dbo_Cat_Articulo.Id_GrupoProductos = dbo_Cat_Grupo_Productos.Id_GrupoProductos )
	                INNER JOIN dbo_Cat_Subgrupo_Productos ON dbo_Cat_Articulo.Id_SubgrupoProductos = dbo_Cat_Subgrupo_Productos.Id_SubgrupoProductos )
	                INNER JOIN dbo_Cat_Linea ON dbo_Cat_Articulo.Id_Linea = dbo_Cat_Linea.Id_Linea )
	                INNER JOIN dbo_Cat_Talla ON dbo_Cat_Articulo.Id_Talla = dbo_Cat_Talla.Id_Talla )
	                INNER JOIN dbo_Cat_Color ON dbo_Cat_Articulo.Id_Color = dbo_Cat_Color.Id_Color )
	                INNER JOIN dbo_Cat_TipoCambio ON dbo_Cat_Moneda.Id_Moneda = dbo_Cat_TipoCambio.Id_Moneda )
                            
                WHERE 

                    dbo_Trans_MovInv_Cab.RFC = '@@RFC'
                AND (@@Estatus = -1 OR @@Estatus = dbo_Trans_MovInv_Cab.Estatus)
                AND (@@Id_Almacen = -1 OR @@Id_Almacen = dbo_Trans_MovInv_Cab.Id_Almacen)
                AND (@@Id_TipoMov = -1 OR @@Id_TipoMov = dbo_Trans_MovInv_Cab.Id_TipoMov_Inv)
                
                AND 
				(
				(@@Tiempo = 1 and Year(dbo_Trans_MovInv_Cab.Fecha_Alta) = Year(NOW()) and Month(dbo_Trans_MovInv_Cab.Fecha_Alta) = Month(NOW())) or
				(@@Tiempo = 2 and Year(dbo_Trans_MovInv_Cab.Fecha_Alta) = Year(DateAdd('m',-1,NOW())) and Month(dbo_Trans_MovInv_Cab.Fecha_Alta) = Month(DateAdd('m',-1,NOW()))) or
				(@@Tiempo = 3 and Year(dbo_Trans_MovInv_Cab.Fecha_Alta) = Year(NOW())) or
				(@@Tiempo = 4 and Year(dbo_Trans_MovInv_Cab.Fecha_Alta) = Year(DateAdd('yyyy',-1,NOW()))) or
				(@@Tiempo = 5)
				)                  
            ";

            Query = Query.Replace("@@RFC", this._RFC);
            Query = Query.Replace("@@Id_Almacen", Id_Almacen.ToString());
            Query = Query.Replace("@@Id_TipoMov", Id_TipoMov.ToString());
            Query = Query.Replace("@@Estatus", Estatus.ToString());
            Query = Query.Replace("@@Tiempo", Tiempo.ToString());

            return SrvDB.ExecuteQuery_Get(Query);
        }

        public DataTable Get_Report(int Tiempo, int Id_Articulo)
        {
            string Query = @"

                SELECT 
       
	                dbo_Trans_MovInv_Cab.RFC, 
	                dbo_Trans_MovInv_Cab.Id_MovInventario, 
	                dbo_Trans_MovInv_Cab.Secuencia, 
	                dbo_Trans_MovInv_Cab.Estatus, 
	                dbo_Cat_Estatus.Nombre AS Estatus_Desc, 
	                dbo_Trans_MovInv_Cab.Fecha_Mov, 
	                dbo_Trans_MovInv_Cab.Descripcion, 
	                dbo_Trans_MovInv_Cab.Id_TipoMov_Inv, 
	                dbo_Cat_TipoMov_Inv.Nombre AS Tipo_Movimiento, 
	                dbo_Cat_TipoMov_Inv.Naturaleza, 
	                dbo_Trans_MovInv_Cab.Referencia, 
	                dbo_Trans_MovInv_Cab.Id_Almacen, 
	                dbo_Cat_Almacen.Descripcion AS Almacen, 
	                dbo_Trans_MovInv_Linea.Id_Linea_MovInventario, 
	                dbo_Trans_MovInv_Linea.Secuencia AS Secuencia_Linea, 
	                dbo_Trans_MovInv_Linea.Id_Articulo, 
	                dbo_Cat_Articulo.Clave AS Clave_Articulo, 
	                dbo_Cat_Articulo.Nombre AS Articulo, 
	                dbo_Cat_Articulo.NombreTicket, 
	                dbo_Trans_MovInv_Linea.Cantidad, 
	                dbo_Trans_MovInv_Linea.Cantidad * dbo_Cat_Articulo.Costo_Std AS Costo_Std, 
	                dbo_Trans_MovInv_Linea.Cantidad * dbo_Cat_Articulo.Costo_Ultimo AS Costo_Ultimo, 
	                dbo_Trans_MovInv_Linea.Cantidad * dbo_Cat_Articulo.Costo_Promedio AS Costo_Promedio, 
              
	                Switch(
		                dbo_Cat_Articulo.Costo_Pref = '1', 	dbo_Trans_MovInv_Linea.Cantidad * dbo_Cat_Articulo.Costo_Std ,
		                dbo_Cat_Articulo.Costo_Pref = '2', 	dbo_Trans_MovInv_Linea.Cantidad * dbo_Cat_Articulo.Costo_Promedio ,
		                dbo_Cat_Articulo.Costo_Pref = '3', 	dbo_Trans_MovInv_Linea.Cantidad * dbo_Cat_Articulo.Costo_Ultimo
                    ) AS Costo_Preferido, 			  
			  	
	                dbo_Trans_MovInv_Linea.Comentarios, 
	                dbo_Cat_Moneda.Clave AS Clave_Moneda, 
	                dbo_Cat_Moneda.Simbolo AS Simbolo_Moneda, 
	                dbo_Cat_Moneda.Nombre AS Moneda, 
	                dbo_Cat_Grupo_Productos.Nombre AS Grupo_Producto, 
	                dbo_Cat_Subgrupo_Productos.Nombre AS Subgrupo_Producto, 
	                dbo_Cat_Linea.Nombre AS Linea, 
	                dbo_Cat_Talla.Nombre AS Talla, 
	                dbo_Cat_Color.Nombre AS Color, 
	                dbo_Cat_TipoCambio.TipoCambio

                FROM            
	
	                ((((((((((((dbo_Trans_MovInv_Cab 
	                INNER JOIN dbo_Trans_MovInv_Linea ON dbo_Trans_MovInv_Cab.Id_MovInventario = dbo_Trans_MovInv_Linea.Id_MovInventario )
	                INNER JOIN dbo_Cat_Almacen ON dbo_Trans_MovInv_Cab.Id_Almacen = dbo_Cat_Almacen.Id_Almacen )
	                INNER JOIN dbo_Cat_Articulo ON dbo_Trans_MovInv_Linea.Id_Articulo = dbo_Cat_Articulo.Id_Articulo )
	                INNER JOIN dbo_Cat_Moneda ON dbo_Cat_Articulo.Id_Moneda = dbo_Cat_Moneda.Id_Moneda )
	                INNER JOIN dbo_Cat_Estatus ON dbo_Trans_MovInv_Cab.Estatus = dbo_Cat_Estatus.Estatus )
	                INNER JOIN dbo_Cat_TipoMov_Inv ON dbo_Trans_MovInv_Cab.Id_TipoMov_Inv = dbo_Cat_TipoMov_Inv.Id_TipoMov_Inv )
	                INNER JOIN dbo_Cat_Grupo_Productos ON dbo_Cat_Articulo.Id_GrupoProductos = dbo_Cat_Grupo_Productos.Id_GrupoProductos )
	                INNER JOIN dbo_Cat_Subgrupo_Productos ON dbo_Cat_Articulo.Id_SubgrupoProductos = dbo_Cat_Subgrupo_Productos.Id_SubgrupoProductos )
	                INNER JOIN dbo_Cat_Linea ON dbo_Cat_Articulo.Id_Linea = dbo_Cat_Linea.Id_Linea )
	                INNER JOIN dbo_Cat_Talla ON dbo_Cat_Articulo.Id_Talla = dbo_Cat_Talla.Id_Talla )
	                INNER JOIN dbo_Cat_Color ON dbo_Cat_Articulo.Id_Color = dbo_Cat_Color.Id_Color )
	                INNER JOIN dbo_Cat_TipoCambio ON dbo_Cat_Moneda.Id_Moneda = dbo_Cat_TipoCambio.Id_Moneda )
                            
                WHERE 

                    dbo_Trans_MovInv_Cab.RFC = '@@RFC'
                AND (dbo_Trans_MovInv_Cab.Estatus = 410)
                AND (dbo_Cat_Articulo.Id_Articulo = @@Id_Articulo)
                
                AND 
				(
				(@@Tiempo = 1 and Year(dbo_Trans_MovInv_Cab.Fecha_Alta) = Year(NOW()) and Month(dbo_Trans_MovInv_Cab.Fecha_Alta) = Month(NOW())) or
				(@@Tiempo = 2 and Year(dbo_Trans_MovInv_Cab.Fecha_Alta) = Year(DateAdd('m',-1,NOW())) and Month(dbo_Trans_MovInv_Cab.Fecha_Alta) = Month(DateAdd('m',-1,NOW()))) or
				(@@Tiempo = 3 and Year(dbo_Trans_MovInv_Cab.Fecha_Alta) = Year(NOW())) or
				(@@Tiempo = 4 and Year(dbo_Trans_MovInv_Cab.Fecha_Alta) = Year(DateAdd('yyyy',-1,NOW()))) or
				(@@Tiempo = 5)
				)                  
            ";

            Query = Query.Replace("@@RFC", this._RFC);
            Query = Query.Replace("@@Id_Articulo", Id_Articulo.ToString());
            Query = Query.Replace("@@Tiempo", Tiempo.ToString());

            return SrvDB.ExecuteQuery_Get(Query);
        }
        
        public DataTable Get_Trans_MovInv_Cabs()
        {

            string Query = @"SELECT 
                                A1.*,
                                A2.Naturaleza as Desc_Naturaleza,
                                A2.Nombre as Desc_Nombre_Movimiento,
                                A3.Descripcion as Desc_Almacen
                             FROM ((
                                dbo_Trans_MovInv_Cab AS A1
                                    INNER JOIN dbo_Cat_TipoMov_Inv AS A2 ON A1.Id_TipoMov_Inv = A2.Id_TipoMov_Inv)
                                    INNER JOIN dbo_Cat_Almacen     AS a3 ON A1.Id_Almacen = A3.Id_Almacen
                             )
                            WHERE A1.RFC = '@@RFC' ORDER BY A1.Id_MovInventario DESC";
            Query = Query.Replace("@@RFC", this._RFC);

            return SrvDB.ExecuteQuery_Get(Query);
        }

        public DataTable Get_Trans_MovInv_Cab_By_Id(int Id_MovInventario)
        {

            string Query = @"SELECT 
                                A1.*,
                                A2.Naturaleza as Desc_Naturaleza,
                                A2.Nombre as Desc_Nombre_Movimiento,
                                A3.Descripcion as Desc_Almacen
                             FROM ((
                                dbo_Trans_MovInv_Cab AS A1
                                    INNER JOIN dbo_Cat_TipoMov_Inv AS A2 ON A1.Id_TipoMov_Inv = A2.Id_TipoMov_Inv)
                                    INNER JOIN dbo_Cat_Almacen     AS A3 ON A1.Id_Almacen = A3.Id_Almacen
                             )
                            WHERE Id_MovInventario = @@Id_MovInventario";
            Query = Query.Replace("@@Id_MovInventario", Id_MovInventario.ToString());            

            return SrvDB.ExecuteQuery_Get(Query);
        }

        public DataTable Get_Trans_MovInv_Lineas(int Id_MovInventario)
        {

            string Query = "SELECT A1.*, A2.Nombre as Desc_Articulo FROM (dbo_Trans_MovInv_Linea as A1 INNER JOIN dbo_Cat_Articulo as A2 ON A1.Id_Articulo=A2.Id_Articulo) WHERE Id_MovInventario = @@Id_MovInventario";
            Query = Query.Replace("@@Id_MovInventario", Id_MovInventario.ToString());

            return SrvDB.ExecuteQuery_Get(Query);
        }

        public DataTable Get_Trans_MovInv_Linea_By_Id(int Id_Linea_MovInventario)
        {
            string Query = "SELECT * FROM dbo_Trans_MovInv_Linea WHERE Id_Linea_MovInventario = @@Id_Linea_MovInventario";
            Query = Query.Replace("@@Id_Linea_MovInventario", Id_Linea_MovInventario.ToString());

            return SrvDB.ExecuteQuery_Get(Query);
        }

        public int Get_TipoInventarioDevolucionCompras()
        {
            string Query = "SELECT * FROM dbo_Cat_TipoMov_Inv WHERE Nombre = 'Devoluciones a Proveedor' AND RFC = '@@RFC'";
            Query = Query.Replace("@@RFC", this._RFC);

            return Int32.Parse(SrvDB.ExecuteQuery_Get(Query).Rows[0]["Id_TipoMov_Inv"].ToString());
        }

        public int Get_TipoInventarioDevolucionVentas()
        {
            string Query = "SELECT * FROM dbo_Cat_TipoMov_Inv WHERE Nombre = 'Devoluciones de Venta' AND RFC = '@@RFC'";
            Query = Query.Replace("@@RFC", this._RFC);

            return Int32.Parse(SrvDB.ExecuteQuery_Get(Query).Rows[0]["Id_TipoMov_Inv"].ToString());
        }

        public int Get_TipoInventarioVentas()
        {
            string Query = "SELECT * FROM dbo_Cat_TipoMov_Inv WHERE Nombre = 'Ventas' AND RFC = '@@RFC'";
            Query = Query.Replace("@@RFC", this._RFC);

            return Int32.Parse(SrvDB.ExecuteQuery_Get(Query).Rows[0]["Id_TipoMov_Inv"].ToString());
        }

        public int Get_TipoInventarioCompras()
        {
            string Query = "SELECT * FROM dbo_Cat_TipoMov_Inv WHERE Nombre = 'Compras' AND RFC = '@@RFC'";
            Query = Query.Replace("@@RFC", this._RFC);

            return Int32.Parse(SrvDB.ExecuteQuery_Get(Query).Rows[0]["Id_TipoMov_Inv"].ToString());
        }

        public int Get_TipoInventarioPV()
        {
            string Query = "SELECT * FROM dbo_Cat_TipoMov_Inv WHERE Nombre = 'Ticket de Venta' AND RFC = '@@RFC'";
            Query = Query.Replace("@@RFC", this._RFC);

            return Int32.Parse(SrvDB.ExecuteQuery_Get(Query).Rows[0]["Id_TipoMov_Inv"].ToString());
        }
        
        public int Get_LastIdMovInventario()
        {
            string Query = "SELECT * FROM dbo_Trans_MovInv_Cab WHERE RFC = '@@RFC' ORDER BY Fecha_Alta DESC";
            Query = Query.Replace("@@RFC", this._RFC);

            return Int32.Parse(SrvDB.ExecuteQuery_Get(Query).Rows[0]["Id_MovInventario"].ToString());
        }        

        #endregion

        #region DELETE

        public Respuesta Delete_Trans_MovInv_Linea(
            object Id
        )
        {
            try
            {
                string Query = @"DELETE FROM dbo_Trans_MovInv_Linea 
                                    WHERE Id_Linea_MovInventario = @@Id";

                Query = Query.Replace("@@Id", ((Int32)Id).ToString());
                return SrvDB.ExecuteQuery_Delete(Query);


            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }
        }

        public Respuesta Delete_Trans_MovInv_Cabs(object Id)
        {
            try
            {
                string Query = @"DELETE FROM dbo_Trans_MovInv_Cab
                                    WHERE Id_MovInventario = @@Id";

                Query = Query.Replace("@@Id", ((Int32)Id).ToString());
                return SrvDB.ExecuteQuery_Delete(Query);


            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }
        }

        #endregion

    }
}
